其他
Windows初始化过程
最近在专研UEFI,发现有段时间没发帖子了, 所以讲一下Windows初始化的过程。
环境:Windows 2004 x64
1 • 前言
2 • UEFI规范
与传统的BIOS引导相反,UEFI规范覆盖了硬件初始化开始到操作系统启动前的每一个步骤,该规范主要分七个步骤,如下:
3 • BootMgr
3.1 EfiEntry
EFI_STATUS __fastcall EfiEntry(
EFI_HANDLE ImageHandle, // 程序内存映像的句柄
EFI_SYSTEM_TABLE *SystemTable // 系统表指针
)
{
int unKnow;
__int64 *BootParameters;
unsigned int Status;
BootParameters = EfiInitCreateInputParametersEx(
ImageHandle,
SystemTable,
unKnow);// 将EfiEntry参数转换为bootmgfw所期望的应用程序参数格式
if ( BootParameters )
Status = BmMain(BootParameters); // 调用Windows引导管理器入口点
else
Status = 0xC000000D; // STATUS_INVALID_PARAMETER
return EfiGetEfiStatusCode(Status); // 将NT状态代码转换为EFI代码
}
该函数首先会调用 EfiInitCreateInputParametersEx 函数。
该函数主要用于将EfiEntry参数转换为bootmgfw.efi所期望的参数格式。
3.2 BmMain
其会调用 BmDisplayGetBootMenuStatus 显示启动菜单,如下图:
再然后其会调用BmpLaunchBootEntry函数,启动应用程序(winload.efi)。
3.3 BmpLaunchBootEntry
ImgArchStartBootApplication 函数原型如下:
EFI_STATUS EFIAPI ImgArchStartBootApplication(
PBL_APPLICATION_ENTRY AppEntry,
VOID* ImageBase, // winload.efi镜像基址
UINT32 ImageSize, // winload.efi镜像大小
UINT8 BootOption,
PBL_RETURN_ARGUMENTS ReturnArguments
);
在其中会初始化winload.efi的内存保护模式,随后调用BlpArchTransferTo64BitApplication 函数,BlpArchTransferTo64BitApplication 会调用Archpx64TransferTo64BitApplicationAsm 函数,最终将控制权交给winload.efi。
4 • Winload
4.1 OslMain
4.2 OslpMain
4.3 OslPrepareTarget
该函数首先调用 BcdUtilGetBootOption 函数确定BCD中激活的选项是否处于活动状态。
随后调用OslpLoadDriverStoreNodes函数读取
"system32\\config\\system",其可以提供哪些驱动需要被加载起来。
接下来调用 OslpLoadSystemHive 函数读取和加载注册表的System Hive, 因为其中包含更多的系统运行参数。
随后调用 OslpLoadAllModules 函数加载所有系统所需要的模块,并为内核准备新的GDT和IDT,以及建立内存映射。
4.4 OslpLoadAllModules
至此 OslpLoadAllModules 函数执行完毕,所有的模块信息存储在了OslLoaderBlock全局变量中。
4.5 OslExecuteTransition
4.6 OslArchTransferToKernel
void __stdcall OslArchTransferToKernel(
ULONG64 OslLoaderBlock, // 存储当前所有系统加载模块的信息
PVOID OslEntryPoint // 内核入口点
);
5 • 参考
软件调试第二版
深入解析windows操作系统第六版
UEFI原理与编程
https://www.n4r1b.com/posts/
看雪ID:灵幻空间
https://bbs.pediy.com/user-home-749013.htm
*本文由看雪论坛 灵幻空间 原创,转载请注明来自看雪社区
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!